/***
 * @接口请求封装
 * @param {axios} 基于接口的请求包
 * @param {qs} 转换为Fromdata形式
 * @module TOKEN_HEADER_NAME 请求头名称
 * @method getToken 读取token带入请求头
 * */
import axios from 'axios';
import qs from 'qs';
import {
  TOKEN_HEADER_NAME,
  FDKMDINFO,
  TOKEN_STORE_NAME
} from './setting';
import {
  getToken
} from '@/utils/token-util';
import store from '@/store';
import router from '@/router/index';
const Seiinfo = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL || window.origin, // 请求地址
  timeout: 30000, // 超时时间
});
const pendingMap=new Map();

function hanDel(config) {
  let {data,method,params,url}= config;
  if(typeof data==='string' ) data=JSON.parse(data);
  const  result =[url,method];
  if(!config.headers.cancellgnoreParams){
    result.push(JSON.stringify(params))
  }
  if(!config.headers.cancellgnoreData){
    result.push(JSON.stringify(data))
  }
  return result.join('&')
}

function addPending(config) {
  const pendingKey=hanDel(config);
  config.cancelToken=config.cancelToken || new axios.CancelToken((cancel)=>{
    if(!pendingMap.has(pendingKey)){
      pendingMap.set(pendingKey,cancel)
    }
  })
}

function removePending(config) {
  const pendingKey= hanDel(config);
  if(!pendingMap.has(pendingKey)){
    const cancelToken=pendingMap.get(pendingKey);
    cancelToken(pendingKey);
    pendingMap.delete(pendingKey)
  }
}


/* 拦截 */
Seiinfo.interceptors.request.use(
  (config) => {

    if (config.headers?.interceptors) {
      removePending(config)
      addPending(config)
    }
    // 非对称加密
    if (config.method == 'post') {
      config.data = Object.assign({}, config.data, Object.keys(config.data).length > 0 ? {
        sing: FDKMDINFO(config)
      } : '');
    }
    // 添加请求头
    let token = getToken();
    config.headers[TOKEN_HEADER_NAME] = token;
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/* 响应 */
Seiinfo.interceptors.response.use(
  (res) => {
    if (res.data?.code == 401) {
      return Promise.reject(res);
    }
    return res;
  },
  (error) => {
    localStorage.removeItem(TOKEN_STORE_NAME);
    store.dispatch('user/fetchUserInfo', null);
    router.replace('/loagin');
  }
);

export default Seiinfo;